Ειδικά Μαθήματα Βοτανικής

logo

Όλα τα απαιτούμενα δεδομένα και αρχεία θα τα βρείτε στον ιστότοπο του μαθήματος στο e-class

1 Δημιουργία Project

Το πρώτο βήμα σε οποιαδήποτε ανάλυση θέλουμε να κάνουμε στην R και το R-studio είναι να οργανώσουμε τα αρχεία τα οποία είναι απαραίτητα για την ανάλυση που θέλουμε να κάνουμε, με τρόπο τέτοιο ώστε να είναι εύκολα διαθέσιμα και προσβάσιμα. Για αυτόν τον λόγο συνεπώς, θα δημιουργούμε κάθε φορά ένα project.

  1. Στο πάνω αριστερά άκρο της οθόνης του R-studio, πατάμε New Project, όπως φαίνεται στην εικόνα:
  1. Στη συνέχεια διαλέγουμε το New directory.
  1. Μετά New Project.
  1. Τέλος, διαλέγουμε που θα δημιουργήσουμε τον φάκελο που θα περιέχει το νέο μας Project.

2 Δομή της R

2.1 Γιατί να χρησιμοποιώ την R;

  1. Η R αποτελεί μια πολύ δυνατή (και δωρεάν!!!) γλώσσα στατιστικού προγραμματισμού
  2. Δουλεύει σε όλα τα λειτουργικά συστήματα (Windows, Mac, Linux)
  3. Είναι λογισμικό ανοικτού κώδικα και αυτό σημαίνει ότι πάρα πολλά άτομα, επεκτείνουν τις δυνατότητες που παρέχονται στην βασική εγκατάσταση (base installation)

Πώς γίνεται αυτό;

Με την δημιουργία επιπλέον βιβλιοθηκών (libraries/packages1) που επιτελούν εξειδικευμένες λειτουργίες.

Αυτή τη στιγμή υπάρχουν περισσότερα από 10.000 ενεργές βιβλιοθήκες για την R.

2.2 Που βρίσκονται αυτές οι βιβλιοθήκες;

Το σύνολο των βιβλιοθηκών που μπορεί κάποιος να χρησιμοποιήσει στην R βρίσκεται στον επίσημο ιστότοπο της R, καθώς και στο github, στο R-Forge και αλλού.

Η R έχει εγκατεστημένες κάποιες βασικές βιβλιοθήκες (base, datasets, utils, grDevices, graphics, stats, methods) και μπορούμε φυσικά να εγκαταστήσουμε όποια βιβλιοθήκη θέλουμε.

2.3 Πώς μπορώ να δώ πού είναι αποθηκευμένες οι βιβλιοθήκες αυτές, αλλά και όσες κατεβάσω;

Πριν κάνουμε οτιδήποτε, πατήστε Ctl + Alt + N, ώστε να δημιουργήσετε ένα κενό αρχείο κώδικα (το πάνω δεξιά τμήμα της οθόνης σας):

Στη συνέχεια πληκτρολογείστε την ακόλουθη εντολή:

.libPaths()

Η R είναι case-sensitive, οπότε πρέπει να είμαστε εξαιρετικά προσεκτικοί όσον αφορά την πληκτρολόγηση οποιασδήποτε εντολής.

2.4 Πώς μπορώ να κατεβάσω μια βιβλιοθήκη στην R;

Εάν θέλουμε να κατεβάσουμε μια βιβλιοθήκη (π.χ., την βιβλιοθήκη ονόματι easypackages) που βρίσκεται στο επίσημο καταθετήριο της R, τότε χρησιμοποιούμε την ακόλουθη εντολή:

## CRAN repository:
install.packages("easypackages", dependencies = TRUE)

Κάντε το ίδιο για τις ακόλουθες βιβλιοθήκες:
1. tidyverse
2. xlsx
3. vegan
4. betapart
5. red
6. raster
7. dplyr
8. magrittr

ΠΡΟΣΟΧΗ

Δεν χρειάζεται να εγκαταστήσουμε δεύτερη φορά την οποιαδήποτε βιβλιοθήκη για να την χρησιμοποιήσουμε. Το μόνο που χρειάζεται να κάνουμε είναι να φορτώσουμε την εκάστοτε βιβλιοθήκη στην R.

2.5 Πώς μπορώ να φορτώσω μια βιβλιοθήκη στην R;

Αφού έχουμε κατεβάσει την βιβλιοθήκη η οποία μας ενδιαφέρει, τότε μπορούμε να χρησιμοποιήσουμε το σύνολο των εντολών τις οποίες περιέχει, φορτώνοντας τη στην R. Αυτό γίνεται με την ακόλουθη εντολή:

## CRAN repository:
library(easypackages)

2.6 Πώς αναβαθμίζω μια ήδη εγκατεστημένη βιβλιοθήκη;

Εάν έχουμε εγκαταστήσει ήδη μια βιβλιοθήκη, μπορούμε να διαπιστώσουμε ποιά έκδοση της έχουμε και εάν χρειάζεται, να την αναβαθμίσουμε:

packageVersion("easypackages")
## [1] '0.1.0'

Κάντε το ίδιο για τις βιβλιοθήκες που εγκαταστήσατε προηγουμένως

update.packages("easypackages")

2.7 Πώς βλέπω ποιές βιβλιοθήκες έχω εγκαταστήσει;

Εάν θέλουμε να δούμε ποιές βιβλιοθήκες έχουμε εγκαταστήσει στον Η/Υ μας, μπορούμε να τρέξουμε την ακόλουθη εντολή:

installed.packages()

2.8 Πώς μπορώ να μάθω τι κάνει και τι εντολές περιέχει μια βιβλιοθήκη;

Εάν για κάποιο λόγο δεν θυμόμαστε ποιές εντολές περιέχει μια βιβλιοθήκη και τι κάνουν αυτές οι εντολές, τοτέ πληκτρολογώντας την ακόλουθη εντολή, μπορούμε να αποκτήσουμε πρόσβαση στο εγχειρίδιο χρήσης της εκάστοτε βιβλιοθήκης:

help(package = "easypackages")

Κάντε το ίδιο για την βιβλιοθήκη xlsx.

2.9 Πώς μπορώ να έχω μια γενική βοήθεια σχετικά με την R;

Χρησιμοποιώντας την ακόλουθη εντολή:

help.start()

2.10 Μπορώ να έχω ένα παράδειγμα σχετικά με κάποια από τις εντολές από μια συγκεκριμένη βιβλιοθήκη;

Εάν δεν γνωρίζουμε πώς ή τι κάνει μια εντολή μια συγκεκριμένης βιβλιοθήκης, τότε υπάρχουν 2 τρόποι για να το διαπιστώσουμε αυτό:
1. Μέσω του εγχειριδίου χρήσης της εκάστοτε βιβλιοθήκης2
2. Μέσω της ακόλουθης εντολής:

example("min", package = "base")

Κάντε το ίδιο για μια εντολή από την βιβλιοθήκη red.

2.11 Πώς μπορώ να φορτώσω πολλές βιβλιοθήκες ταυτόχρονα;

Με την εντολή:

libraries("red", "raster")

Tip
Μπορούμε να πληκτρολογήσουμε easypackages::libraries('red', 'raster') εάν για οποιονδήποτε λόγο δεν θέλουμε να φορτώσουμε την βιβλιοθήκη easypackages.

2.12 Πώς μπορώ να δω σε ποιόν φάκελο δουλεύω;

Είναι εξαιρετικά χρήσιμο να γνωρίζουμε σε ποιόν φάκελο αποθηκεύει η R τα δεδομένα που προκύπτουν από την ανάλυση μας. Εάν έχουμε δημιουργήσει ένα project, τότε αυτόματα η R θα αποθηκεύσει οτιδήποτε δημιουργήσουμε σε αυτόν τον φάκελο.

getwd()
## [1] "G:/Academic/Lessons/EMB/Labs/Labs/TRUE RMD Files/EMB/2020"

2.13 Πώς μπορώ να δημιουργήσω έναν νέο φάκελο μέσω της R;

Έστω ότι θέλουμε να δημιουργήσουμε έναν νέο φάκελο για να αποθηκεύσουμε κάποιες εικόνες που έχουμε δημιουργήσει στην R. Τον φάκελο αυτό (που θέλουμε να τον ονομάσουμε Figures) τον δημιουργούμε με την ακόλουθη εντολή:

dir.create('./Figures)

Προσέξτε ότι το τμήμα του κώδικα ./ υποδηλώνει ότι θέλουμε ο φάκελος να δημιουργηθεί εντός του κεντρικού φακέλου (working directory) στον οποίο εργαζόμαστε.

Δημιουργήστε τώρα τρεις φακέλους, ως εξής:
1. Έναν φάκελο ονόματι Scripts
2. Έναν φάκελο ονόματι Data
3. Έναν φάκελο ονόματι RDS εντός του φακέλου Data.

##-------------------------
## The solution
##-------------------------
dir.create("./Scripts")
dir.create("./Data")
dir.create("./Data/RDS")

2.14 Πώς μπορώ να αποθηκεύσω σε άλλον φάκελο τα αποτελέσματα της ανάλυσης;

Εάν θέλουμε να αλλάξουμε τον φάκελο στον οποίο θα αποθηκεύσουμε κάτι, αυτό γίνεται με την ακόλουθη εντολή:

setwd("./Scripts")

3 Δημιουργία δεδομένων στην R

Υπάρχουν 6 βασικοί τύποι δεδομένων που μπορούμε να δημιουργήσουμε στην R:
1. Διανύσματα (Vectors)
2. Μήτρες (Matrices)
3. Συστοιχίες (Arrays)
4. Factors
5. Πίνακες (Dataframes) 6. Λίστες (Lists)

Κάθε ένας εξ αυτών των τύπων έχει διαφορετικά χαρακτηριστικά. Οι 4 πρώτοι τύποι περιλαμβάνουν μόνο ομοιογενή στοιχεία (δηλαδή, μόνο αριθμητικά, ποιοτικά ή λογικά δεδομένα), ενώ οι 2 τελευταίοι μπορούν να περιλαμβάνουν ανομοιογενή δεδομένα.

Εικόνα 1. Τύποι δεδομένων

Εικόνα 1. Τύποι δεδομένων

Εικόνα 2. Ομοιογενείς και ανομοιογενείς τύποι δεδομένων

Εικόνα 2. Ομοιογενείς και ανομοιογενείς τύποι δεδομένων

Υπάρχει επίσης ένας επιπλέον τύπος δεδομένων που αποτελεί παραλλαγή του dataframe και ονομάζεται tibble. Θεωρείται (και είναι) ο πιο εύχρηστος τύπος δεδομένων, καθώς είναι αρκετά πιο ευανάγνωστος, περιεκτικός και τακτοποιημένος3.

3.1 Πώς γράφω κώδικα;

Πριν δούμε πώς μπορούμε να δημιουργήσουμε οποιονδήποτε τύπο δεδομένων, θα χρειαστεί να κατανοήσουμε πώς γράφουμε κώδικα στην R:
1. Εάν θέλουμε να χρησιμοποιήσουμε ξανά και ξανά κάποια δεδομένα στην ανάλυση μας, θα χρειαστεί να τα αποθηκεύσουμε σε ένα αντικείμενο στην R και να ονοματοδοτήσουμε το αντικείμενο αυτό. Διαλέγουμε ένα όνομα (π.χ., numbers) και για να αποθηκεύσουμε τα δεδομένα μας θα πρέπει δεξιά από το όνομα του αντικειμένου να τοποθετήσουμε ένα βέλος (numbers <-). Στη συνέχεια, δεξιά από το βέλος τοποθετούμε τα δεδομένα που θέλουμε να αποθηκεύσουμε σε αυτό το αντικείμενο (numbers <- 1).

2. Θα πρέπει πάντα να έχουμε στο μυαλό μας ότι κατά πάσα πιθανότητα δεν θα θυμόμαστε τι κάνει μια σειρά από εντολές ή γιατί έχουμε γράψει τις συγκεκριμένες εντολές. Κατά συνέπεια, καλό είναι να σχολιάζουμε τον κώδικα μας. Αυτό γίνεται με το σύμβολο #. Οτιδήποτε έπεται του συμβόλου αυτού, θεωρείται ως σχόλιο από την R και δεν το αξιολογεί ως κάτι το οποίο πρέπει να αναλυθεί. Ως εκ τούτου, εάν πληκτρολογήσουμε # numbers <- 1, δεν θα δημιουργηθεί το αντικείμενο numbers.

3. Προκειμένου να είναι ευανάγνωστος ο κώδικας μας, καλό είναι να μην είναι της αρχαιοελληνικής μορφής (Εικόνα 3), αλλά να υπάρχουν κενά διαστήματα μεταξύ των λέξεων/αριθμών/εκφράσεων.

4. Πολύ σημαντικό είναι να ονοματοδοτούμε τα αντικείμενα με τέτοιον τρόπο, ώστε να είναι εύκολο να αντιληφθούμε τι περιέχουν/κάνουν.

## Good names
weather_analysis
emerson_text_analysis

## Bad ones
basic_stuff
detail

Καλό είναι λοιπόν να ακολουθούμε τους ανωτέρω κανόνες4.

Εικόνα 3. Αρχαιοελληνική επιγραφή

Εικόνα 3. Αρχαιοελληνική επιγραφή

Ας δούμε τώρα πώς μπορούμε να γράψουμε κώδικα και να δημιουργήσουμε δεδομένα.

3.2 Παράδειγμα οργάνωσης κώδικα

Ένα τυπικό αρχείο που περιέχει κώδικα, έχει την ακόλουθη μορφή:

##===============================================================================##
##
## Thinning and cleaning the occurrence data
##
##===============================================================================##


##=================================================================================
## Load the packages
##=================================================================================
library(spThin)
library(biogeo)
##=================================================================================


##=================================================================================
## Thinning and cleaning
##=================================================================================

## Create petromarula.clim 
coordinates(bol_creutz_creutz) <- c("decimalLongitude","decimalLatitude")

pts.clim <- raster::extract(predictors_Crete_current, bol_creutz_creutz, method = "bilinear")

petromarula.clim <- data.frame(cbind(coordinates(bol_creutz_creutz), 
                                     pts.clim, 
                                     bol_creutz_creutz@data))

## Original number of occurrences
nrow(petromarula.clim)

## Visualization
levelplot(predictors_Crete_current$GRC_msk_alt,
          col.regions = colorRampPalette(c('grey90', 'yellow4', 'green4'))(100)) +
  layer(sp.points(SpatialPoints(bol_creutz_creutz), pch=20, col=1))
##=================================================================================



##=================================================================================
# It searches for mismatches between country names in the dataset and those
# extracted using the point records. Records for which there are no
# environmental data (based on the object rst) are indicated with a value of one
# in the field called wrongEnv. Low precision records are indicated by a value
# of one in the field lowprec. Environmental outliers are indicated by a value
# of one in a field beginning with the name of the environmental variable and
# ending either in "_e" for records assessed using boxplot statistics (e.g.
# bio1_e) or ending in "_j" for records assessed using the reverse jackknife
# procedure. The recorded elevation values for records (specified with a field
# name in elevc) are compared to digital elevation model values (which are
# returned in the field demElevation) and indicated as a mismatch if they exceed
# the value specified in the parameter called diff (the difference in metres).
##=================================================================================

data(world)
spoccs <- petromarula.clim %>% as.data.frame() %>% 
  dplyr::rename(x = decimalLongitude, y = decimalLatitude, Species = Taxon) %>% 
  addmainfields(species = "Species") %>% errorcheck(world, dem = predictors_Crete_current$GRC_msk_alt, 
                                                    dat = ., 
                                                    # countries = "country", 
                                                    vars = c('bio_1', 'bio_2', 
                                                             'bio_3', 'bio_4', 
                                                             'bio_5', 'bio_6', 
                                                             'bio_7', 'bio_8', 
                                                             'bio_9', 'bio_10', 
                                                             'bio_11', 'bio_12', 
                                                             'bio_13', 'bio_14', 
                                                             'bio_15', 'bio_16', 
                                                             'bio_17', 'bio_18', 
                                                             'bio_19', 'GRC_msk_alt'), 
                                                    res = 0.5, 
                                                    elevc = "GRC_msk_alt", 
                                                    diff = 250)
##=================================================================================


##=================================================================================
# The field called "error" will contain a value of one if there are any values of
# one in CountryMismatch, CountryMismatch, wrongEnv or any of the outlier
# fields. The field called "spperr" will contain ones for all records of a
# species for which there are one or more errors.
##=================================================================================
spoccs

spoccs$dups
spoccs$Exclude
spoccs$Reason
spoccs$CountryMismatch
spoccs$wrongEnv
spoccs$lowprec
spoccs$elevMismatch
spoccs$demElevation
spoccs$error
spoccs$spperr
##=================================================================================


##=================================================================================
## Create a new object without duplicate records and records without elevation
##=================================================================================
spoccs_cleared <- spoccs %>% filter(dups != 1 & demElevation != 'NA')

##=================================================================================


##=================================================================================
## Number of occurrences after error checking
##=================================================================================
nrow(spoccs_cleared)
nrow(petromarula.clim)
##=================================================================================


##=================================================================================
## Save results excel
##=================================================================================
library(xlsx)
write.xlsx(spoccs, "./biogeo/Initial results Bolanthus creutzburgii subsp. creutzburgii.xlsx")
write.xlsx(spoccs_cleared, "./biogeo/Final resultsBolanthus creutzburgii subsp. creutzburgii.xlsx")
##=================================================================================


##=================================================================================
## Min distance 1 km, repeat it for 1000 times
##=================================================================================
thinned <- thin(loc.data = spoccs_cleared, lat.col = "y", long.col = "x", 
                spec.col = "Species", thin.par = 1, reps = 1000, verbose = T, 
                out.dir = "./Thinned", locs.thinned.list.return = TRUE, 
                write.files = TRUE, out.base = "Bolanthus creutzburgii subsp. creutzburgii")
##=================================================================================

3.3 Πώς δημιουργώ ένα διάνυσμα;

Με το γράμμα c λέμε στην R να ενώσει ότι ακολουθεί

##------------------------
## Numeric data
##------------------------
numbers <- c(0, 1, 1, 2, 3, 5, 8)
numbers


##------------------------
## Text data
##------------------------
words <- c("one", "two", "three")
words


##------------------------
## Logical data
##------------------------
boolean <- c(TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE)
boolean

3.4 Πώς δημιουργώ ένα διάνυσμα το οποίο περιέχει δεδομένα κειμένου;

Όσον αφορά δεδομένα κειμένου, πρέπει να βρίσκονται εντός αγγλικών εισαγωγικών. Ας δούμε το ακόλουθο παράδειγμα:

##------------------------
## A famous quote
##------------------------
star.wars <- c("there", "is", "no", "try", ":", "do", "or", "do", "not")
star.wars


##------------------------
## Yet another one
##------------------------
han.solo <- c("I", "have", "a", "bad", "feeling", "about", "this")
han.solo

Μπορούμε να ενώσουμε δύο τέτοια διανύσματα ως εξής:

leia.organa <- c(han.solo, "Han", "you", "always", "say", "this")
leia.organa

3.5 Πώς δημιουργώ μη τυχαίους και τυχαίους αριθμούς σε ένα διάνυσμα;

Υπάρχουν αρκετοί τρόποι για να το πετύχουμε αυτό:

##-------------------------------------------------------------------
## Non random numeric data
##-------------------------------------------------------------------

## E.g., from 1 to 10
numbers_non_random <- 1:10
numbers_non_random


## E.g., from 1 to 21 by 2
numbers_non_random <- seq(from = 1, to = 21, by = 2)
numbers_non_random


## E.g., from 1 to 21 adding 1.5
numbers_non_random <- seq(0, 21, length.out = 15)
numbers_non_random


## E.g., from 1 to 21 for two times
numbers_non_random <- rep(1:21, times = 2)
numbers_non_random


## E.g., from 1 to 21 for two times (ordered)
numbers_non_random <- rep(1:21, each = 2)
numbers_non_random


##-------------------------------------------------------------------
## Random numeric data
##-------------------------------------------------------------------

## E.g., Create 25 numbers from 0 to 10 with a normal distribution
random_numbers <- runif(25, min = 0, max = 10)
random_numbers


## E.g., Create 25 numbers from 0 to 10 and replacing them
random_numbers <- sample(0:25, replace = TRUE)
random_numbers

3.5.1 Άσκηση

Δημιουργήστε τα ακόλουθα διανύσματα:
1. Ένα αριθμητικό διάνυσμα που να περιέχει τους πρώτους 5 ζυγούς αριθμούς
2. Ένα διάνυσμα με δεδομένα κειμένου που να περιέχει τις πρωτεύουσες της Ελλάδας, της Ιταλίας και της Ισπανίας
3. Ένα διάνυσμα που να περιέχει τους αριθμούς από το 32 έως το 79, ανά 3
4. Ένα διάνυσμα που να περιέχει τους ίδιους αριθμούς όπως το προηγούμενο, προσαυξημένους κατά 2.8
5. Ένα διάνυσμα που να περιέχει 49 τυχαίους αριθμούς με ομοιόμορφη κατανομή

##-------------------------
## The solution
##-------------------------
num_vector <- c(2, 4, 6, 8, 10)
capitals <- c("Athens", "Rome", "Madrid")
sec_vector <- seq(from = 31, to = 79, by = 3)
third_vector <- seq(31, 79, length.out = 28)
fourth_vector <- runif(49)

Για κάθε μη ομοιόμορφη κατανομή, υπάρχουν 4 τρόποι (λειτουργίες) να δημιουργήσουμε τυχαίους αριθμούς:

1. r random number generation
2. d probability mass function
3. p cumulative distribution
4. q quantiles

##-------------------------------------------------------------------
## Random data creation
##-------------------------------------------------------------------
## In order to replicate the result, we must do the following:
set.seed(1234)

## Normal distribution, zero mean and sd = 1
normal <- rnorm(25, mean = 0, sd = 1)
normal


## Poisson distribution lambda 4
pois <- rpois(25, lambda = 4)
pois

Κάντε το ίδιο, δημιουργώντας ένα διάνυσμα για 56 αριθμούς με μέση τιμή 100 και τ.α. 15.

3.6 Σύγκριση διανυσμάτων

Μπορούμε επίσης να συγκρίνουμε δύο διανύσματα που περιέχουν αριθμητικά δεδομένα:

1. x < y # is x less than y
2. x > y # is x greater than y
3. x <= y # is x less than or equal to y
4. x >= y # is x greater than or equal to y
5. x == y # is x equal to y
6. x != y # is x not equal to y

x <- 9
y <- 10

x == y
## [1] FALSE
x < y
## [1] TRUE
x != y
## [1] TRUE

3.7 Πώς δημιουργώ μια μήτρα;

Με την εντολή matrix(), η οποία περιέχει τα ακόλουθα επιχειρήματα (arguments):

  1. vector περιέχει τα στοιχεία της μήτρας
  2. nrow & ncol πόσες σειρές και στήλες, αντίστοιχα θα έχει η μήτρα
  3. dimnames όνομα του κάθε διανύσματος
  4. byrow εάν η μήτρα θα γεμίσει με δεδομένα πρώτα σε κάθε σειρά (byrow = TRUE) ή στήλη (byrow = FALSE)
##-------------------------
## An example
##-------------------------
my_first_matrix <- matrix(1:20, nrow = 5, ncol = 4)
my_first_matrix

Δοκιμάστε το με το byrow = T.

##-------------------------
## Another example
##-------------------------
cells <- c(1, 26, 24, 68)  ## Cells
rnames <- c("R1", "R2")  ## Row names
cnames <- c("C1", "C2")  ## Column names
mymatrix <- matrix(cells, nrow = 2, ncol = 2, byrow = TRUE, dimnames = list(rnames, 
    cnames))  ## Create a 2 x 2 matrix
mymatrix

3.8 Πώς δημιουργώ έναν πίνακα (dataframe);

Με την εντολή data.frame():

##-------------------------
## An example
##-------------------------
patientID <- c(1, 2, 3, 4)  ## Numeric vector
age <- c(25, 34, 28, 52)  ## Numeric vector
diabetes <- c("Type1", "Type2", "Type1", "Type1")  ## Character vector
status <- c("Poor", "Improved", "Excellent", "Poor")  ## Character vector
patientdata <- data.frame(patientID, age, diabetes, status)
patientdata

3.9 Πώς δημιουργώ έναν factor;

Αυτός ο τύπος αντικείμενου είναι μια ποιοτική μεταβλητή, η οποία μπορεί να είναι ταξινομημένη κατά μέγεθος.

##------------------------------------------------------------------------------
## An example
##------------------------------------------------------------------------------

## Let's first create two numeric vectors
patientID <- c(1, 2, 3, 4)
age <- c(25, 34, 28, 52)
##------------------------------------------------------------------------------


##------------------------------------------------------------------------------
## Then two qualitative vectors
##------------------------------------------------------------------------------
diabetes <- c("Type1", "Type2", "Type1", "Type1")
status <- c("Poor", "Improved", "Excellent", "Poor")
##------------------------------------------------------------------------------


##------------------------------------------------------------------------------
## Join them in a dataframe
##------------------------------------------------------------------------------
patientdata <- data.frame(patientID, age, diabetes, status)
##------------------------------------------------------------------------------

Με την εντολή class(diabetes) μπορούμε να διαπιστώσουμε τι είδους μεταβλητή είναι αυτή. Ποιο είναι το αποτέλεσμα της εντολής summary(diabetes);

Ας πάρουμε την πρώτη ποιοτική μεταβλητή (diabetes). Για να την μετατρέψουμε σε factor, κάνουμε το εξής:

diabetes <- factor(diabetes)
diabetes

Τι είδους μεταβλητή είναι τώρα ο diabetes; Ποιο είναι τώρα το αποτέλεσμα της εντολής summary(diabetes);

Εάν τώρα έχουμε μια ποιοτική μεταβλητή, η οποία είναι ιεραρχικα διαβαθμισμένη, θα προσθέσουμε ordered = TRUE. Μια τέτοια μεταβλητή είναι το status

status <- factor(status, ordered = TRUE)
status

Γιατί;

Γιατί ο φτωχός (poor) ασθενής έχει μικρότερη οικονομική άνεση από ότι ο εύπορος (excellent) ασθενής και θα πάρει κατώτερη τιμή (3 αντί για 1 - θυμηθείτε μιλάμε για ιεράρχιση, οπότε το 1 είναι πιο πάνω από το 3).

Όμως, by default η R κατασκευάζει τα επίπεδα των factor μεταβλητών με αλφαβητική σειρά.

Με τη μεταβλητή status δεν είχαμε πρόβλημα, γιατί όντως η οικονομική κατάσταση των ασθενών ακολουθούσε αυτή τη σειρά (Excellent, Improved, Poor). Εάν όμως αντί για Poor ήταν Ailing (και αυτό σημαίνει φτωχός), θα υπήρχε πρόβλημα.

Τί κάνουμε σε αυτή την περίπτωση;

Μπορούμε να υπερκεράσουμε την default επιλογή, χρησιμοποιώντας την έκφραση levels

Επί παραδείγματι:

status <- factor(status, order = TRUE, levels = c("Poor", "Improved", "Excellent"))

Με αυτόν τον τρόπο, 1 = Poor, 2 = Improved, 3 = Excellent (Το 3 εδώ είναι το καλύτερο).

ΠΡΟΣΟΧΗ

Πρέπει να δώσουμε τιμές για όλα τα επίπεδα της ποσοτικής μας μεταβλητής. Εάν δεν γίνει αυτό, αυτές που δεν θα έχουν καθοριστεί με την έκφραση levels, δεν θα ληφθούν υπ’όψιν.

4 Εισαγωγή εξωτερικών δεδομένων στην R

Η συνηθέστερη μορφή αρχείου που μπορεί να περιέχει δεδομένα τα οποία θέλουμε να εισαγάγουμε στην R είναι αρχεία excel (είτε της μορφής .xlsx είτε της μορφής .csv). Ας δούμε λοιπόν πώς μπορούμε να φορτώσουμε τέτοια αρχεία στην R. Μπορείτε να δείτε στην Εικόνα 4 ένα cheatsheet για την βιβλιοθήκη readr που είναι ιδιαίτερα χρήσιμη για την εισαγωγή αρχείων στην R.

Εικόνα 4. readr cheatsheet

Εικόνα 4. readr cheatsheet

Στην περίπτωση που δεν έχετε κατεβάσει ήδη τα απαραίτητα αρχεία, κάντε το τώρα:

Για να φορτώσουμε ένα αρχείο της μορφής .xlsx θα χρησιμοποιήσουμε την βιβλιοθήκη readxl η οποία αποτελεί τμήμα της βιβλιοθήκης tidyverse:

## =============================================================================
## Let's load an xlsx file
## =============================================================================

## Remember that you need to change the folder path
aegean <- readxl::read_excel("G:/Academic/Lessons/EMB/Labs/Labs/EXCEL/Aegean.xlsx")

Όπως και πριν, έαν δεν έχετε κατεβάσει ήδη τα απαραίτητα αρχεία, κάντε το τώρα:

Για να φορτώσουμε ένα αρχείο της μορφής .csv θα χρησιμοποιήσουμε εντολές από το base installation:

## ==============================================================================
## Let's load a csv file
## ==============================================================================

## Remember that you need to change the folder path
japan <- read.csv("G:/Academic/Lessons/EMB/Labs/Labs/CSV/Ryukyus.csv", h = T, 
    sep = ";", row.names = 1)

## It's useful to see the help file for this command and get an idea of what
## the different arguments are for

Για να φορτώσουμε ένα αρχείο της μορφής .txt μπορούμε να χρησιμοποιήσουμε τις ακόλουθες εντολές:

## ==============================================================================
## Let's load a txt file
## ==============================================================================

## Base r function
deers <- read.table("G:/Academic/Lessons/EMB/Labs/Labs/TXT/Deer.txt", sep = "\t", 
    header = T)

## readr library
deers <- readr::read_tsv("G:/Academic/Lessons/EMB/Labs/Labs/TXT/Deer.txt")

4.1 Πώς βλέπουμε ποιά και πόσα αρχεία έχουμε φορτώσει/φτιάξει στην R;

Εάν θέλουμε τώρα να δούμε πόσα και ποιά αρχεία/αντικείμενα έχουμε φορτώσει στην R, πληκτρολογούμε την ακόλουθη εντολή:

ls()
##  [1] "aegean"        "age"           "capitals"      "deers"        
##  [5] "diabetes"      "digits"        "fourth_vector" "japan"        
##  [9] "num_vector"    "patientdata"   "patientID"     "sec_vector"   
## [13] "status"        "third_vector"  "x"             "y"

4.2 Πώς αφαιρούμε κάποια αρχεία από την R;

Εάν θέλουμε τώρα να αφαιρέσουμε κάποια αρχεία/αντικείμενα που έχουμε φορτώσει στην R, πληκτρολογούμε την ακόλουθη εντολή:

rm(list = ls())  ## Removes everything

rm(japan)  ## Removes only japan

4.3 Πώς γράφουμε στον δίσκο ένα αρχείο που έχουμε φτιάξει στην R;

Εάν θέλουμε τώρα να αποθηκεύσουμε κάποια αρχεία/αντικείμενα που έχουμε φτιάξει στην R, πληκτρολογούμε την ακόλουθη εντολή:

xlsx::write.xlsx(aegean, './Test data.xlsx)

Ή με την εντολή:

write.csv(aegean, '.Test data.csv)

Κάποιες φορές όμως, μπορεί το εκάστοτε αντικείμενο να είναι πολύ μεγάλο σε μέγεθος ή να μην είναι συμβατό με το Excel και να χρειάζεται να το αποθηκεύσουμε σε μια άλλη μορφή, εύκολα διαχειρίσιμη τόσο από την R, αλλά και τον Η/Υ μας. Στην περίπτωση αυτή, αποθηκεύουμε το αντικείμενο μας υπό την μορφή .rds αρχείου:

saveRDS(aegean, './Test data.rds)

Και εάν θέλουμε να φορτώσουμε ξανά αυτό το αρχείο στην R, τότε γίνεται με την εντολή:

Aegean <- readRDS('./Test data.rds)

5 Χρήσιμα ρήματα στην R

Πάρα πολλές φορές θα χρειαστεί να κάνετε κάποιες τροποποιήσεις στα δεδομένα που θα έχετε εισαγάγει/δημιουργήσει στην R. Δύο πολύ χρήσιμες βιβλιοθήκες για τον σκοπό αυτό, είναι η dplyr και η tidyr (δείτε το cheatsheet τους). Τα βασικά ρήματα είναι τα εξής:
1. select
2. rename
3. filter
4. slice
5. arrange
6. distinct
7. mutate
8. summarise

Άλλα χρήσιμα ρήματα είναι τα ακόλουθα:
1. contains
2. ends_with
3. everything
4. starts_with

Όπως διαπιστώνετε η πλειονότητα εξ αυτών στην ουσία δεν χρειάζεται επεξήγηση για το τι κάνουν. Μπορούμε επίσης να χρησιμοποιήσουμε συγχρόνως κάποιους λογικούς κανόνες, όπως οι ακόλουθοι:
1. < Μικρότερο από
2. > Μεγαλύτερο από
3. <= Μικρότερο ή ίσο από
4. >= Μεγαλύτερο ή ίσο από
5. == Ίσο με
6. != Διαφορετικό από
7. & Και
8. | Ή

Ας δουλέψουμε λοιπόν με το αρχείο aegean το οποίο έχουμε φορτώσει στην R προηγουμένως. Θέλουμε να διαλέξουμε τις μεταβλητές Island και Endemics:

aegean_selection <- select(aegean, Island, Endemics)

Εάν θέλουμε να διαλέξουμε μόνο τις μεταβλητές που ξεκινούν από a, πληκτρολογούμε το εξής:

aegean_selection_new <- select(aegean, starts_with("A"))

5.1 Αλυσιδωτές εντολές

Πιθανόν να έχετε διαπιστώσει ότι ίσως να υπάρχει ένας άλλος, πιο γρήγορος, καθαρός και ξεκούραστος τρόπος να γράφει κάποιος κώδικα. Και δεν θα έχετε άδικο. Με το σύμβολο %>% από την βιβλιοθήκη magrittr, μας δίνεται η δυνατότητα μέσα σε λίγες σειρές κώδικα να αυτοματοποιήσουμε και απλοποιήσουμε κάποιες διαδικασίες. Επί παραδείγματι, ας υποθέσουμε ότι θέλουμε να διαλέξουμε κάποιες μεταβλητές από το το αντικείμενο aegean, να δημιουργήσουμε μια νέα μεταβλητή, να διαλέξουμε συγκεκριμένες σειρές και να τις ταξινομίσουμε κατά αύξουσα σειρά. Εάν δεν χρησιμοποιήσουμε το προαναφερθέν σύμβολο, τότε ο κώδικας μας θα ήταν αρκετά πιο μεγάλος και πιο επιρρεπής σε λάθη. Ας το δούμε στην πράξη:

aegean_pp <- aegean %>% select(Island, Native, Endemics, Area, Elevation) %>% 
    mutate(logArea = log10(Area)) %>% filter(Elevation >= 450) %>% arrange(Native)

Δημιουργήστε ένα αντικείμενο το οποίο θα περιέχει:
1. τις μεταβλητές Island, Area, Endemics, Temperature, Rainfall, SES_PBD_End, LGM_Temp
2. δύο νέες μεταβλητές, τις LogEndemics και Perc_Temp_Change. Η πρώτη αποτελεί τον λογάριθμο (10) της μεταβλητής Endemics, ενώ η δεύτερη ορίζεται ως \[\frac{Temperature - LGM_Temp}{Temperature}\]
3. μόνο τα νησιά με έκταση μεγαλύτερη από 100 km2
4. και θα είναι ταξινομημένα κατά μέγεθος

## ============================================================================##
## The solution
## ============================================================================##
new_aegean_selection <- aegean %>% select(Island, Area, Endemics, Temperature, 
    Rainfall, SES_PBD_End, LGM_Temp) %>% mutate(LogEndemics = log10(Endemics), 
    Perc_Temp_Change = (Temperature - LGM_Temp)/Temperature) %>% filter(Area > 
    100) %>% arrange(desc(Area))

5.2 Ομαδοποίηση δεδομένων σε ένα αντικείμενο

Μπορεί να θέλουμε να ομαδοποιήσουμε τα δεδομένα μιας μεταβλητής σύμφωνα με μια άλλη, προκειμένου να εξάγουμε κάποια στατιστικά στοιχεία. Αυτό γίνεται ως εξής:

aegean_gr <- aegean %>% group_by(Region)

Κάντε το ίδιο για την μεταβλητή Size.

5.3 Στατιστικά στοιχεία από ομαδοποιημένες μεταβλητές

Αφού έχουμε ομαδοποιήσει τα δεδομένα μας, θέλουμε να δημιουργήσουμε ένα νέο αρχείο το οποίο θα περιέχει κάποια βασικά στατιστικά στοιχεία για τις διάφορες κατηγορίες που μας ενδιαφέρουν (εδώ: οι φυτογεωγραφικές περιοχές του Αιγαίου).

aegean_grp <- aegean %>% group_by(Region) %>% summarise(max_Endemics = max(Endemics), 
    min_Endemics = min(Endemics), mean_Endemics = mean(Endemics), median_Endemics = median(Endemics), 
    SD_Endemics = sd(Endemics), Count = n())

6 Εργασία για το σπίτι

Έχετε διορία επτά (7) ημερών να στείλετε την εργασία σας σε μορφή PDF5 σε αυτό το e-mail και να απαντήσετε στα ακόλουθα ερωτήματα, αφού έχετε περιγράψει το σετ δεδομενων το οποίο έχετε χρησιμοποιήσει:
1. Πόσα βασίλεια και υποβασίλεια έχει έχει;
2. Πόσα νησιά ανήκουν σε κάθε βασίλειο, υποβασίλειο και νησιωτικό τύπο;
3. Πόσα νησιά ανήκουν σε κάθε βασίλειο ανά νησιωτικό τύπο;
4. Δημιουργήστε ένα νέο αντικείμενο το οποίο έχει ομαδοποιημένα τα νησιά κατά βασίλειο και νησιωτικό τύπο και δίνει στατιστικές πληροφορίες (max, min, mean, median & sd) για τις μεταβλητές Area έως και Temperature, καθώς και Precipitation, S_angio και S_palms.
5. Κάντε το ίδιο, αλλά η ομαδοποίηση να αφορά το υποβασίλειο.
6. Δημιουργήστε ένα νέο αντικείμενο το οποίο περιέχει μόνο τα νησιά όπου το υψόμετρο είναι μεγαλύτερο από 563 και η μεταβλητή Precipitation μικρότερη από 900. Πόσα νησιά περιέχει το αντικείμενο το οποίο δημιουργήσατε; Πόσα από αυτά ανήκουν σε κάθε νησιωτικό τύπο; Ποιος νησιωτικός τύπος φιλοξενεί τα περισσότερα είδη (μέση τιμή και διάμεσος); Απαντήστε στις ίδιες ερωτήσεις, αλλά για τα βασίλεια και τα υποβασίλεια.
7. Δημιουργήστε ένα νέο αντικείμενο ίδιο με το προηγούμενο βήμα και διαλέξτε τις ίδιες μεταβλητές. Στη συνέχεια, δημιουργήστε τις νέες λογαριθμημένες μεταβλητές για κάθε μια εξ αυτών. Ακολούθως, διαλέξτε μόνο τις σειρές όπου ο αριθμός των ειδών είναι μικρότερος από 100 και ταξινομηστε τα δεδομένα σας σύμφωνα με τη μεταβλητή Elevation. Πόσα νησιά περιέχει το αντικείμενο το οποίο δημιουργήσατε; Ποιο νησί έχει τα περισσότερα είδη;


  1. Ο όρος βιβλιοθήκη (library) χρησιμοποιείται όταν φορτώνουμε ένα πακέτο (package) στην R, αλλά και όταν αναφερόμαστε στο πακέτο αυτό καθ’αυτό. Από εδώ και στο εξής θα αναφερόμαστε στα packages ως βιβλιοθήκες

  2. Η συντριπτική πλειοψηφία των βιβλιοθηκών παρέχουν παραδείγματα για το πώς μπορεί κάποιος να χρησιμοποιήσεις τις εντολές που περιέχουν

  3. Θα αντιληφθείτε σε λίγο γιατί

  4. Εάν κάποιος από εσάς θέλει να εμβαθύνει, ας κοιτάξει αυτόν τον σύνδεσμο

  5. Διαφορετικά δεν θα γίνει δεκτή και δεν θα βαθμολογηθείτε

Κώστας Κουγιουμουτζής

Spring semester 2019-2020

 

Delivered to you by Dr. Kostas Kougioumoutzis

kkougiou@aua.gr